/**
 * InfoWindow模块 - 负责地图信息窗口的创建、管理和交互
 * 提供信息窗口批量创建、事件绑定和实例管理功能
 */

import type { InfoWindowModule, InfoWindowInstance, InfoWindowOptions } from "./types/index";

export default {
  name: "InfoWindow",
  AMap: null as any,
  map: null as any,
  // 存储所有创建的信息窗口实例
  infoWindowInstances: [] as InfoWindowInstance[],

  /**
   * 初始化方法 - 批量创建信息窗口
   * @param {InfoWindowOptions[]} options - 信息窗口配置数组
   * @returns {Promise<InfoWindowModule>} 返回创建的信息窗口模块
   * @throws {TypeError} 当参数不是数组时抛出警告
   */
  init(options: InfoWindowOptions[]): Promise<InfoWindowModule> {
    return new Promise((resolve, reject) => {
      if (!Array.isArray(options)) {
        console.warn("InfoWindow模块: 参数必须是信息窗口配置数组");
        reject(new TypeError("参数必须是数组"));
        return;
      }

      // 先移除已有信息窗口
      this.removeInfoWindows();

      // 过滤无效配置并创建窗口
      this.infoWindowInstances = options
        .filter(option => option && typeof option === "object")
        .map(option => this.createSingleInfoWindow(option, this.map))
        .filter((instance): instance is InfoWindowInstance => Boolean(instance));

      // 返回创建的信息窗口实例数组
      resolve({
        name: "InfoWindow",
        instance: this.infoWindowInstances,
        events: {
          remove: this.removeInfoWindows.bind(this)
        }
      });
    });
  },

  /**
   * 创建单个信息窗口
   * @param {InfoWindowOptions} option - 信息窗口配置
   * @param {AMap.Map} map - 要绑定的地图实例
   * @returns {InfoWindowInstance | null} 信息窗口实例或null
   */
  createSingleInfoWindow(option: InfoWindowOptions, map: any): InfoWindowInstance | null {
    if (!option || !option.position || !map) {
      console.error("无效的信息窗口配置或地图实例");
      return null;
    }
    try {
      const infoWindow = new this.AMap.InfoWindow({
        ...option,
        content: option.content || "默认信息内容",
        offset: option.offset || [0, -30],
        autoMove: option.autoMove || false
      });

      infoWindow.open(map, option.position); // 使用传入的map实例而非this.map
      return infoWindow;
    } catch (error) {
      console.error("创建信息窗口失败:", error);
      return null;
    }
  },

  /**
   * 移除所有信息窗口
   */
  removeInfoWindows(): void {
    this.infoWindowInstances.forEach(window => window.close());
    this.infoWindowInstances = [];
  }
};
